package com.sky.orders.controller;

import com.sky.dto.OrdersCancelDTO;
import com.sky.dto.OrdersConfirmDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.dto.OrdersRejectionDTO;
import com.sky.orders.service.OrderService;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * 订单管理 controller
 */
@Slf4j
@Api(tags = {"订单管理"}, description = "后台订单操作")
@RestController
@RequestMapping("/admin/order")
public class OrderController {


    @Resource
    private OrderService orderService;



    /**
     * 订单管理
     *        分页-条件查询订单
     */
    @ApiOperation(tags = {"订单管理"}, value = "分页-条件查询订单", notes = "分页、条件查询订单列表")
    @GetMapping("/conditionSearch")
    public Result<PageResult> queryPage(OrdersPageQueryDTO ordersPageQueryDTO){
        log.info("[PC端]订单管理 - 分页-条件查询订单: {}", ordersPageQueryDTO);
        PageResult pageResult = orderService.queryPage(ordersPageQueryDTO);
        return Result.success(pageResult);
    }



    /**
     * 订单管理
     *        根据id查询订单和明细
     */
    @ApiOperation(tags = {"订单管理"}, value = "查询订单和明细", notes = "根据id查询订单和订单明细")
    @GetMapping("/details/{id}")
    public Result<OrderVO> getOrderAndOrderDetailById(@PathVariable(name="id")Long id){
        log.info("[PC端]订单管理 - 根据订单id: {},查询订单和订单明细列表", id);
        OrderVO orderVO = orderService.getOrderAndOrderDetailById(id);
        return Result.success(orderVO);
    }



    /**
     * 订单管理
     *        统计订单订单状态为 status= 2待接单 3已接单 4派送中 5已完成 6已取消 数量
     */
    @ApiOperation(tags = {"订单管理"}, value = "统计各状态订单数量", notes = "统计各状态订单数量")
    @GetMapping("/statistics")
    public Result<OrderStatisticsVO> statusCounts(){
        log.info("[PC端]订单管理 - 统计status= 2待接单 3已接单 4派送中 5已完成 6已取消 各自数量");
        OrderStatisticsVO orderStatisticsVO = orderService.statusCounts();
        return Result.success(orderStatisticsVO);
    }



    /**
     * 订单管理
     *        接单(修改订单状态)
     */
    @ApiOperation(tags = {"订单管理"}, value = "商家接单", notes = "根据id修改订单状态")
    @PutMapping("/confirm")
    public Result receiveOrders(@RequestBody @Validated OrdersConfirmDTO ordersConfirmDTO){
        log.info("[PC端]订单管理 - 接单,订单id: {}", ordersConfirmDTO.getId());
        orderService.receiveOrders(ordersConfirmDTO);
        return Result.success();
    }



    /**
     * 订单管理
     *        拒单
     * - 商家拒单其实就是将订单状态修改为“已取消”
     * - 只有订单处于“待接单”状态时可以执行拒单操作
     * - 商家拒单时需要指定拒单原因
     * - 商家拒单时，如果用户已经完成了支付，需要为用户退款
     */
    @ApiOperation(tags = {"订单管理"}, value = "商家拒单", notes = "根据订单id，修改订单状态和填写拒单原因")
    @PutMapping("/rejection")
    public Result rejectionOrders(@RequestBody @Validated OrdersRejectionDTO ordersRejectionDTO){
        log.info("[PC端]订单管理 - 拒单,订单id: {}, 拒单原因: {}", ordersRejectionDTO.getId(), ordersRejectionDTO.getRejectionReason());
        orderService.rejectionOrders(ordersRejectionDTO);
        return Result.success();
    }



    /**
     * 订单管理
     *        商家取消订单
     * - 取消订单其实就是将订单状态修改为“已取消”
     * - 商家取消订单时需要指定取消原因
     * - 商家取消订单时，如果用户已经完成了支付，需要为用户退款
     */
    @PutMapping("/cancel")
    public Result merchantCancelOrder(@RequestBody @Validated OrdersCancelDTO ordersCancelDTO){
        log.info("[PC端]订单管理 - 商家取消订单,订单id: {},取消原因: {}", ordersCancelDTO.getId(), ordersCancelDTO.getCancelReason());
        orderService.merchantCancelOrder(ordersCancelDTO);
        return Result.success();
    }



    /**
     * 订单管理
     *        派送
     */
    @PutMapping("/delivery/{id}")
    public Result deliveryOrder(@PathVariable(name="id")Long id){
        log.info("[PC端]订单管理 - 订单派送,订单id: {}", id);
        orderService.deliveryOrder(id);
        return Result.success();
    }



    /**
     * 订单管理
     *       订单完成
     */
    @PutMapping("/complete/{id}")
    public Result completeOrder(@PathVariable(name="id")Long id){
        log.info("[PC端]订单管理 - 订单id:{},完成送达", id);
        orderService.completeOrder(id);
        return Result.success();
    }



}
